package main

import "fmt"

// 通过闭包实现斐波拉契数列
func FibonacciTow(n int) func() (int, bool) {
	a, b, c := 1, 1, 2
	i := 0
	return func() (int, bool) {
		if i >= n {
			return 0, false
		} else if i < 2 {
			f := i
			i++
			return f, true
		}

		a, b = b, c
		c = a + b
		i++

		return a, true
	}
}

// 迭代器就是一个闭包函数
func Fibonacci(n int) func(yield func(int) bool) {
	a, b, c := 0, 1, 1
	return func(yield func(int) bool) {
		for range n {
			if !yield(a) {
				return
			}
			a, b = b, c
			c = a + b
		}
	}
}

func main() {
	n := 8
	// Go 的迭代器是range over func风格，我们可以直接用for range关键字来进行使用，使用起来也要比原来更方便
	for i := range Fibonacci(n) {
		fmt.Println(i)
	}
}
